home *** CD-ROM | disk | FTP | other *** search
-
- #include "FRTrackObjects.h"
- #include "FRCar.h"
-
-
- TERTTIImplementation(FRBarrier, TEEngineObject);
- TERTTIImplementation(FRRoadSign, TEEngineObject);
-
-
- FRBarrier::FRBarrier(TECustomEntity* pEnt)
- {
- m_bClip = true;
- m_fElasticity = 0.01f;
- m_fFrictionFactor = 0.9f;
- m_pBoundingVolume = new TEAABoundingBox;
- m_pBoundingVolume->UpdateVolume(pEnt->m_pPolygonList, true);
- m_Plane = *pEnt->m_pPolygonList->GetPlanes();
- }
-
- bool FRBarrier::Clips(TEBoundingVolume &rVol, TEPlane &rPlane)
- {
- if(m_pBoundingVolume->IntersectsVolume(rVol) && rVol.IntersectsVolume(m_Plane))
- {
- rPlane = m_Plane;
- return true;
- }
- else return false;
- }
-
- bool FRBarrier::VolStaticInfluence(UInt32 ulDeltaT, TEEngineObject* pObject)
- {
- if(TEIsDerivedFromClass(FRCar, pObject))
- {
- TEBoundingVolume* pBound = pObject->GetBoundingVolume();
-
- if(m_pBoundingVolume->IntersectsVolume(*pBound) && pBound->IntersectsVolume(m_Plane))
- {
- TEVector C = pObject->GetCenter();
- TEVector Tmp = pBound->GetCenter();
- if(m_Plane.DistanceToPlane(Tmp) >= 0)
- {
- pBound->PutOnPlane(m_Plane);
- C += pBound->GetCenter() - Tmp;
- pObject->SetCenter(C);
- return true;
- }
- }
- }
-
- return false;
- }
-
-
-
- FRRoadSign::FRRoadSign(TECustomEntity* pEnt)
- {
- TEOBoundingBox *pOBox = new TEOBoundingBox;
- TEAABoundingBox BBox;
- TEVector Min, Max;
- TEString Name;
-
- m_Center = pEnt->m_Position;
- m_Rotation.m_fY = *(Float*)(pEnt->m_acData+4);
-
- switch(*(Int32*)pEnt->m_acData){
- default:
- case 0:
- Name = "sign-stop.tmf";
- break;
- case 1:
- Name = "sign-sixty.tmf";
- break;
- case 2:
- Name = "sign-hundred.tmf";
- break;
- case 3:
- Name = "sign-empty.tmf";
- break;
- case 4:
- Name = "sign-question.tmf";
- break;
- case 5:
- Name = "sign-camel.tmf";
- break;
- };
-
- m_pModelRef = TEModelManager::GetModelManager()->GetModel(Name);
-
- Min = TEVector(2.0f, 2.0f, 2.0f);
- m_pModelRef->SetScale(Min);
-
- TEAssert(m_pModelRef);
-
- BBox = m_pModelRef->GetModelBBox();
- BBox.GetData(Min, Max);
-
- pOBox->SetData(m_Center, Min, Max, m_Rotation);
-
- m_pBoundingVolume = pOBox;
-
- m_bStatic = true;
- m_fMass = 10.0f;
- m_fElasticity = m_fFrictionFactor = 0.1f;
- m_ulClipTime = 0;
- }
-
- void FRRoadSign::Animate(UInt32 ulDeltaT, TEEngine* pEngine)
- {
- if(m_ulClipTime != 0)
- {
- TEOBoundingBox* pBox = (TEOBoundingBox*) m_pBoundingVolume;
- TEAABoundingBox BBox;
- TEVector Min, Max;
-
- m_ulClipTime += ulDeltaT;
-
- if(m_ulClipTime > 10000)
- m_ulClipTime = 0;
-
- m_Rotation.m_fX += ulDeltaT * 0.36f;
-
- BBox = m_pModelRef->GetModelBBox();
- BBox.GetData(Min, Max);
- pBox->SetData(m_Center, Min, Max, m_Rotation);
- }
- }
-
- void FRRoadSign::OnClip(TEEngineObject* pInfluencer)
- {
- if(!TEIsTypeOfClass(TEBSPTerrain, pInfluencer))
- {
- m_Velocity.m_fY = 100.0f;
- m_bStatic = false;
- m_bApplyGravity = true;
- m_ulClipTime = 1;
- }
- else if(m_ulClipTime != 0)
- m_ulClipTime = 0;
- }
-
- bool FRRoadSign::VolStaticInfluence(UInt32 ulDeltaT, TEEngineObject* pObject)
- {
- return VolVolInfluence(ulDeltaT, pObject);
- }
-